package com.atguigu.shiro.Web;

import com.atguigu.shiro.dao.SysUserMapper;
import com.atguigu.shiro.dto.SysUserDto;
import com.atguigu.shiro.entity.SysUser;
import com.atguigu.shiro.response.WebResponse;
import com.atguigu.shiro.service.SysUserService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.validation.Valid;

@RestController
@RequestMapping("/users")
public class SysUserController {

    @Autowired
    private SysUserService sysUserService;

    @Resource
    private SysUserMapper sysUserMapper;

    /**
     @Api：用在请求的类上，表示对类的说明
     tags="说明该类的作用，可以在UI界面上看到的注解"
     value="该参数没什么意义，在UI界面上也看到，所以不需要配置"

     @ApiOperation：用在请求的方法上，说明方法的用途、作用
     value="说明方法的用途、作用"
     notes="方法的备注说明"

     @ApiImplicitParams：用在请求的方法上，表示一组参数说明
     @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面
     name：参数名
     value：参数的汉字说明、解释
     required：参数是否必须传
     paramType：参数放在哪个地方
     · header --> 请求参数的获取：@RequestHeader
     · query --> 请求参数的获取：@RequestParam
     · path（用于restful接口）--> 请求参数的获取：@PathVariable
     · body（不常用）
     · form（不常用）
     dataType：参数类型，默认String，其它值dataType="int"
     defaultValue：参数的默认值

     @ApiResponses：~~ ***用在请求的方法上，表示一组响应
     @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息
     code：数字，例如400
     message：信息，例如"请求参数没填好"
     response：抛出异常的类

     @ApiModel：用于响应类上，表示一个返回响应数据的信息
     （这种一般用在post创建的时候，使用@RequestBody这样的场景，
     请求参数无法使用@ApiImplicitParam注解进行描述的时候）
     @ApiModelProperty：用在属性上，描述响应类的属性

     [swagger中参数为数组dataType的设置
     https://blog.csdn.net/KingJin_CSDN_/article/details/81536315?utm_source=blogxgwz0]
     */
    @ApiOperation(value = "搜索列表",notes = "通过street街道名来搜索")
    //@ApiImplicitParam(name = "street",value = "街道名",required = true,dataType = "String")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "street",value = "街道名",required = true,dataType = "String"),
            @ApiImplicitParam(name = "pageNum",value = "当前页",required = true,dataType = "int"),
            @ApiImplicitParam(name = "pageSize",value = "总页数",required = true,dataType = "int")})
    //@NeedLogin
    @GetMapping("/listByStreetname")
    public WebResponse list(@RequestParam("street") String street, @RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize) {
        return WebResponse.resSuccess("查询成功", sysUserService.list(street, pageNum, pageSize));
    }

    /**
     * 创建一个用户
     */
    @ApiOperation(value = "创建用户",notes = "用户名/账号 + 密码")
    @RequestMapping(value = "/addUser",method = RequestMethod.POST)
    public WebResponse addUser(@RequestBody @Valid SysUserDto sysUserDto){
        SysUser sysUser = new SysUser();
        BeanUtils.copyProperties(sysUserDto,sysUser);
        return WebResponse.resSuccess("新增成功",sysUserMapper.insertSelective(sysUser));
    }

}
